Object-Oriented Programming
limitation of function pointer
低レベルな話しをすれば、OOP言語機能は関数ポインタの隠蔽に等しい
what is OOP
2.5 Object-Oriented Programming
p. 7
The programming paradigm is:
Decide which classes you want;
provide a full set of operations for each class;
make commonality explicit by using inheritance.
ソフトウェア危機の当事者は、差分プログラミングをこそ銀の弾丸だと捉えたらしい
メリット
WIP
雑感
例えば、 composition や trait しかない言語もある
table:no_inheritance
Go composision
Rust trait
抱き合わせ商法
すべてが(ミニ)コンピューターである
もっと言えば、遅延実装による(早まった)決定の遅延にこそ妙義があったwint.icon
しかし産業界でこれは難しい…
@wint7: いくら Smalltalk とは言え、リリース後には100%のリカバリーは不可能だと思う(プログラマーごと出荷されない限り…) 逆に最初の定義はあくまで狭義のOOP
通俗的な利点はOOPLというよりOOUIでは?
cf. React や Elm で UI をやるのに OOPL は必要ない
人間のため?
@tadsan: オブジェクト指向は機械が実行するために有利な性質はあまりないような気がする(要出典)ので、OOPは文芸的技法 いくつかの性質がある
それらの部分集合
ref.
* mutable state を使うスタイル
* subtype polymorphism のこと
* カプセル化のこと
* メッセージパッシングのこと
* 実装の継承のこと
* なんか分からんが猫クラスのこと
* 箱
等やこれらの組み合わせを指す場合があるので気を付ける必要がある
10年以上前に、既に、今さら正確な定義を試みても、みんなを満足させるものは出来ず、何の意味もないので「オブジェクト指向」って用語を捨てよう、ってことが言われてたみたい。
@phenan: オブジェクト指向と呼ばれるもの、人によって定義が違うが、以下のもののいずれかないし組み合わせであることが多い: * 情報隠蔽 (カプセル化)
* ポリモーフィズム
* 実装継承
* mutable state
@phenan: これらのうち実装継承はアンチパターンであることが周知されてきている。 mutable stateは最適化テクニックであり、常用するべきではない。
したがって、多くのケースで有用なのは情報隠蔽とポリモーフィズム。
@phenan: サブタイプポリモーフィズムは実際の型を隠蔽することで情報隠蔽を実現できる。 したがって、
「現代的なオブジェクト指向とは、サブタイプポリモーフィズムを指す」
として良さそうに思える
状態に着目した定義
「オブジェクト指向とは状態を隠蔽する機構のこと」
OOPL の subset
特徴
オブジェクトあり
ref.
クラスというモジュール機構に着目した視点
しかし、それならモジュール指向と言えば十分だwint.icon
それにモジュールの方が汎用的な概念だ。
ref.
↑
ちがうよ。凝集度はオブジェクト指向よりも広い概念だもん。主にはパッケージとクラスだし、オブジェクト指向でない言語の、同種の関数と型を集めたモジュールにも言えるよね。関数内が構造的に書かれている様子にも言える
@tanakahisateru: オブジェクト指向というのは、少なくとも、プログラムの複雑さを閉じて隠蔽し、対外的なシンプルさでもって、ビルディングブロックをモノのように組み立てることなので、詳細コードのひとつひとつに均一なコード品質を求める癖をつけるのは、むしろオブジェクト指向を下手にすると思う 性質一覧
dot notation
polymorphism
protocol
subtyping
inheritence
trait
prototype
implicit module
mutable state
hidden state
ADT系列の祖
プロセスによるシミュがメイン
Smalltalk に影響した
ref.
Simula 67
る
focusing message passing
遅延を意識していたと言う
“What I got from Simula was that you could now replace bindings and assignment with goals. The last thing you wanted any programmer to do is mess with internal state even if presented figuratively. Instead, the objects should be presented as sites of higher level behaviors more appropriate for use as dynamic components.” - Alan Kay, The early history of Smalltalk. In History of programming languages—II, 1993.
「Simulaから得たものは、バインディングと代入をゴールに置き換えることができるということです。プログラマが一番やりたくないことは、たとえ比喩的な表現であっても、内部の状態をいじくり回すことです。その代わりに、オブジェクトは動的なコンポーネントとして使用するのに適した、より高度な動作の現場として提示されるべきである。" - Alan Kay, The early history of Smalltalk. プログラミング言語の歴史-II, 1993.
focusing low-level
memory aware
文字通りプロトタイピングを意識してたらしい
Smalltalkへのカウンターだったらしい
io
Self 系列
purest one
LISP
Objective-C
C + Object System
OOPL as a subsystem
Smalltalkの特色を色濃く受け継いだObjective-Cでは、メッセージとメソッドを明確に使い分けている。
メソッド=メッセージは複合主キーで識別できるセレクターで動的ディスパッチしてるようだwint.icon
厳密には、メソッド=メッセージは無名と言えそうだwint.icon
ref.
guide
歴史
関連